/*
 * ControllerListenerPopupJTableProperties.java
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * 
 * Creado el 26/04/2010, 08:26:29 AM
 */
package com.ufps.cuatro.controlador.listener;

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTable;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.representacion.ParametroPropiedad;
import com.ufps.cuatro.modelo.representacion.Propiedad;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.vistas.representacion.JDialogPropiedadesComponente;

/**
 * <i><b>ControllerListenerPopupJTableProperties:</b></i><p>Gestiona los Menus emergentes en la aplicación.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 26/04/2010
 * @see MouseAdapter
 * @see Observer
 * 
 */
public class ControllerListenerPopupJTableProperties extends MouseAdapter implements Observer{
    
    private JPopupMenu popup;
    private Object objSeleccionado;    
    private JTable objTable;
    private Object objParent;

    /**
     * Constructor por Defecto.
     */
    public ControllerListenerPopupJTableProperties() {
    }
    
    /**
     * Constructor que inicializa las refercnais de Control.
     * @param objParent Contenedor Padre.
     * @param objTable Control que implementa el Menú.
     * @param objSeleccionado Objeto que puede implementar el Menú.
     */
    public ControllerListenerPopupJTableProperties(Object objParent, JTable objTable, Object objSeleccionado) {          
        this.objParent = objParent;
        this.objSeleccionado = objSeleccionado;         
        this.objTable = objTable;
        crearPopupMenu();
    }

    /**
     * Devuelve la Referencia del Arbol uqe implementa el Menú.
     * @return Referencia del Arbol uqe implementa el Menú.
     */
    public JTable getObjTabla() {
        return objTable;
    }

    /**
     * Devuelve la Referecnia del Objeto Padre Contenedor del Control que Implementa le Menú.
     * @return Referecnia del Objeto Padre Contenedor del Control que Implementa le Menú.
     */
    public Object getObjParent() {
        return objParent;
    }    
    
    /**
     * Determina si el Objeto puede Implementar un Menú.
     * @param obj Objeto que puede Implementar un Menú.
     * @return boolean que determina si el Objeto puede Implementar un Menú.
     */
    public static boolean isValidObjectToMenu(Object obj){
        if(obj instanceof Propiedad){
            return true;
        }
        return false;
    }   
    
    private void crearPopupMenu(){
        if(objSeleccionado instanceof Propiedad){
            crearPopupMenuPropiedad();
        }
    }    
    
    private void crearPopupMenuPropiedad(){
        popup = this.createPopupMenuPropiedad();
        popup.setLightWeightPopupEnabled(true);                 
    }

    @Override
    public void mousePressed(MouseEvent e) {
        maybeShowPopup(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        maybeShowPopup(e);
    }

    private void maybeShowPopup(MouseEvent e) {
        try{
            if (e.isPopupTrigger() && objTable.isEnabled()) {
                Point p = new Point(e.getX(), e.getY());
                int col = objTable.columnAtPoint(p);
                int row = objTable.rowAtPoint(p); 
                mostrarPopupMenuPropiedad(objTable.getValueAt(row, col), p);
            }                
        }
        catch(java.lang.NullPointerException ex){
            UtilRender.printlnConsole(ex.getMessage(), UtilRender.ACTION_ERROR, true);
        }
    }           
    
    
    private void mostrarPopupMenuPropiedad(Object objElemento, Point p){        
        this.objSeleccionado = objElemento;
        if(popup == null){
            this.crearPopupMenu();
        }                    
        if(objElemento instanceof Propiedad){
            System.out.println(objElemento);
            popup.show(objTable, p.x, p.y);
        }        
    }
    

    /**
     * Devuelve la Referecnia del Objeto que Implementar el Menú.
     * @return Referecnia del Objeto que Implementar el Menú.
     */
    public Object getObj() {
        return objSeleccionado;
    }

    /**
     * Devuelve el Menú emergente implementado en el contexto actual.
     * @return Menú emergente implementado en el contexto actual.
     */
    public JPopupMenu getPopup() {
        return popup;
    }    
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor Generador.
     * @return Menú emergente implementado en un Componente Distribuidor Generador.
     */
    private JPopupMenu createPopupMenuPropiedad(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();                
        objPopup.add(createPopupItemMenuResetValueProperties());
        return objPopup;
    }
    
    private JMenuItem createPopupItemMenuResetValueProperties(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Borrar Valor");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                resetValuePropertie();
            }
        });
        return menuItem;
    }
    
    private void resetValuePropertie(){
        if(objSeleccionado instanceof Propiedad){
            if(UtilRender.msgConfirmar("¿Desea Eliminar el Valor de la Propiedad Actual?\nSe reestablecerá con el Valor Inicial de la Propiedad.")){
                Propiedad objPropiedad = (Propiedad) objSeleccionado;          
                
                if(objPropiedad.getObjParametrosSet().size() == 1){
                    ParametroPropiedad objParametro = objPropiedad.getObjParametrosSet().get(0);
                    objPropiedad.strValueTempParametro = objParametro.getStrValue();
                    if(objParametro.getStrEditor().equals("JCheckBox")){
                        if(!objParametro.getStrValue().isEmpty()){
                            if(objParametro.getStrValue().equals("true")){
                                objPropiedad.getObjParametrosSet().get(0).setStrValue(objParametro.getStrValueDefault());
                            }                            
                        }                                        
                    }
                    else if(objParametro.getStrEditor().equals("JTextField")){
                        if(!objParametro.getStrValue().isEmpty()){
                            objPropiedad.getObjParametrosSet().get(0).setStrValue(objParametro.getStrValueDefault());
                        }
                    }
                    else if(objParametro.getStrEditor().equals("JColorChooser")){
                        if(!objParametro.getStrValue().isEmpty()){                    
                            objPropiedad.getObjParametrosSet().get(0).setStrValue(objParametro.getStrValueDefault());
                        }
                    }
                    else if(objParametro.getStrEditor().equals("JFileChooser")){
                        if(!objParametro.getStrValue().isEmpty()){                    
                            objPropiedad.getObjParametrosSet().get(0).setStrValue(objParametro.getStrValueDefault());
                        }
                    }
                }
                Bandera objBandera = new Bandera();            
                objBandera.addObserver((Observer) objParent);                    
                objBandera.setObj("");
                objBandera.setEstado(Bandera.VALUE_RESET_PROPERTIES);
                objBandera.notificar();
            }
        }
    }

    public void update(Observable o, Object arg) {
        try{
            if(o instanceof Bandera){
                if(objParent instanceof JDialogPropiedadesComponente){
                    JDialogPropiedadesComponente objDialog = (JDialogPropiedadesComponente) objParent;
                    Bandera objBandera = (Bandera) o;
                    objBandera.deleteObservers();
                    objBandera.addObserver(null);
                    objBandera.notificar();                
                }
                else{
                    Bandera objBandera = (Bandera) o;
                    objBandera.deleteObservers();
                    objBandera.addObserver((Observer) objParent);                    
                    objBandera.notificar();
                }
            }       
        }catch(java.lang.NullPointerException ex){  
            UtilRender.printlnConsole(ex.getMessage(), UtilRender.ACTION_ERROR, true);
        }
    }
}
